
/*#include<stdio.h>
#include<string.h>
void Reverse(char temp[])
{
    //放里面定义,每一次自动重置
		  char s[610][50];
		  int cnt=0;//cnt计数单词的个数
		  int len=strlen(temp);
		  int wordStart=0,flag=0;
		  //flag标识现在是否是单词状态中
		  for(int i=0;i<len;i++){
			  if(temp[i]!=' '&&temp[i]!='\0'&&flag==0){ //进入单词状态
				  flag=1;
				  wordStart=i;
			  }
			  if(flag==1&&(temp[i]==' '||temp[i]=='\0')){
				//此时为空格或者\0,flag为1,说明该单词结束
				for(int j=wordStart;j<i;j++){
					s[cnt][j-wordStart]=temp[j];  //这里赋值看清楚哈
				}
				//这两步操作尤为关键
				s[cnt][i-wordStart]='\0'; //注意\0的导入
				cnt++;//cnt计数单词的个数
				flag=0;//单词状态结束	
			  }
			  
		  }	
		  
		  //进行输出,这里就很简单了
	//	  for(int i=cnt-1;i>=0;i--) printf("%s ",s[i]); //打印即可
	if(cnt!=0){//如果非空
			for(int i=cnt-1;i>=0;i--){
				if(i==cnt-1) printf("%s",s[i]);  //避免多余空格
				else printf(" %s",s[i]);
			}
		  printf("\n");
	  }
}
int main()
{
	  char temp[50050];
	  while(gets(temp)!=NULL)
      {
          Reverse(temp);
      }
}


*/
#include <stdio.h>
#include <string.h>
void Reverse(char s[])
{
    char a[610][50];int sum=0,flag=0,num=0;
	for(int i=0;s[i]!='\0';i++){//flag=0为空格 
		if(flag==0&&s[i]!=' '){//开始时或者空格后的新单词
			flag=1;//遇到单词flag变为1
			a[++sum][0]=s[i];
			num=1;
		}
		else if(flag==1&&s[i]!=' ')//不是新读入的单词 则单词长度++
		{
			a[sum][num++]=s[i];
		}
		if(flag==1&&s[i]==' ')//遇到空格 单词结束输入‘\0’
		{
			a[sum][num]='\0';
			flag=0;//遇到空格flag变为0
		}
	}
	a[sum][num]='\0';//处理最后一个单词
	for(int i=sum;i>0;i--)
	{
		if(i!=1)	printf("%s ",a[i]);
		else printf("%s",a[i]);//oj的末尾单词空格判断
	}
    printf("\n");
}
int main()
{
    char s[50001];
    while(gets(s)!=NULL)
        Reverse(s);

}